/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao.questionnaire;

import dao.DaoAbstract;
import entities.questionnaire.Questionnaire;
import entities.questionnaire.TypeQuestionnaire;
import entities.utilisateur.AbstractRepondant;
import entities.utilisateur.Createur;
import entities.utilisateur.RepondantAuthentifie;
import entities.utilisateur.Valideur;
import java.util.Calendar;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

/**
 *
 * @author aurelien.emery
 */
@Stateless
public class DaoQuestionnaire extends DaoAbstract<Questionnaire> implements DaoQuestionnaireLocal {

    @PersistenceContext(unitName = "EJBProjetEFPPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public DaoQuestionnaire() {
        super(Questionnaire.class);
    }

    /*
     ************************METHODES
     */
 
    public List<Questionnaire> chercherQuestionnaireDispo(AbstractRepondant user) {
        if (RepondantAuthentifie.class.isAssignableFrom(user.getClass())){
            try {
               return em.createNamedQuery("Questionnaire.findQuestionnaireDispoAuth").setParameter("User", user).setParameter("now", Calendar.getInstance()).getResultList();
            } catch (NoResultException noResutlExcep) {
                return null;
            }
        }else{
            try {
                return em.createNamedQuery("Questionnaire.findQuestionnaireDispoNoAuth").setParameter("TypeQuestionnaire", TypeQuestionnaire.FERME).setParameter("now", Calendar.getInstance()).getResultList();
            } catch (NoResultException noResutlExcep) {
                return null;
            }
        }
    }

    public List<Questionnaire> chercherQuestionnaireDispoRange(AbstractRepondant user, int[] range) {
        if (RepondantAuthentifie.class.isAssignableFrom(user.getClass())){
            try {
                Query q = em.createNamedQuery("Questionnaire.findQuestionnaireDispoAuth").setParameter("User", user).setParameter("now", Calendar.getInstance());
                q.setMaxResults(range[1] - range[0]);
                q.setFirstResult(range[0]);
                return q.getResultList();

            } catch (NoResultException noResutlExcep) {
                return null;
            }
        }else{
            try {
                Query q = em.createNamedQuery("Questionnaire.findQuestionnaireDispoNoAuth").setParameter("TypeQuestionnaire", TypeQuestionnaire.FERME).setParameter("now", Calendar.getInstance());
                q.setMaxResults(range[1] - range[0]);
                q.setFirstResult(range[0]);
                return q.getResultList();
            } catch (NoResultException noResutlExcep) {
                return null;
            }
        }
    }

    @Override
    public List<Questionnaire> chercherQuestionnaireAValider() {
        try {
            return em.createNamedQuery("Questionnaire.findQuestionnaireAValider").getResultList();
        } catch (NoResultException noResutlExcep) {
            return null;
        }
    }

    
    public List<Questionnaire> chercherQuestionnaireEnCreation(Createur user) {
        try {
            return em.createNamedQuery("Questionnaire.findQuestionnaireEnCreation").setParameter("User", user).getResultList();
        } catch (NoResultException noResutlExcep) {
            return null;
        }
    }

    @Override
    public List<Questionnaire> findAll() {
        Query q = em.createNamedQuery("Questionnaire.findAllQuestionnaire");
        //q.setParameter("title", recherche + "%");
        return q.getResultList();
    }

    @Override
    public int count() {
        Query q = em.createNamedQuery("Questionnaire.findAllQuestionnaire");
        //q.setParameter("title", recherche + "%");
        return q.getMaxResults();
    }

    @Override
    public List<Questionnaire> findRange(int[] range) {
        Query q = em.createNamedQuery("Questionnaire.findAllQuestionnaire");
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

    public void valide(Questionnaire questionnaire, Valideur valideur) {
        questionnaire.setDateValidation(Calendar.getInstance());
        questionnaire.setValideur(valideur);
        edit(questionnaire);
    }

    @Override
    public long getLastIdQuestionnaire() {
        Query q = em.createNamedQuery("Questionnaire.findLastIdQuestionnaire");
        return (Long)q.getResultList().get(0);
    }

    public List<Questionnaire> chercherQuestionnaireAPasser(AbstractRepondant user) {
        try {
            return em.createNamedQuery("Questionnaire.findQuestionnaireAPasser").setParameter("now", Calendar.getInstance()).setParameter("User", user).getResultList();
        } catch (NoResultException noResutlExcep) {
            return null;
        }
    }

    public List<Questionnaire> chercherQuestionnaireADiffuser() {
        try {
            return em.createNamedQuery("Questionnaire.findQuestionnaireADiffuser").setParameter("now", Calendar.getInstance()).setParameter("now", Calendar.getInstance()).getResultList();
        } catch (NoResultException noResutlExcep) {
            return null;
        }
    }


}
